import UIKit
//数组使用有序表存储同一类型的多个值
//两种形式:Array<SomeType> 和 [SomeType]
//var shoppingList: [String] = ["Eggs", "Milk"]
var shoppingList = ["Eggs", "Milk"]
//访问和修改数组
shoppingList.count
if shoppingList.isEmpty {
    print("empty")
}
shoppingList.append("Flour")
shoppingList += ["Baking Powder"]
shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
var first = shoppingList[0] //下标从0开始
//还可利用下标来一次改变一系列数据值。即使新数据和原有数据的数量不一样。
shoppingList[4...6] = ["Bananas", "Apples"]
shoppingList.count

//shoppingList[6] 错误，索引越界
//在具体索引前插入元素
shoppingList.insert("Maple Syrup", at: 0)
let mapleSyrup = shoppingList.remove(at: 0)
shoppingList[0] //Eggs
//移除最后一项
shoppingList.removeLast()

//数组的遍历 for-in
for item in shoppingList {
    print(item)
}

for (index, value) in shoppingList.enumerated() {
    print("index \(index)'s value is \(value)")
}
      
//创建并构造一个数组
var someInt = [Int]()
//空数组
someInt.append(3)
someInt = []
//Swift的Array类型还提供了一个可以创建特定大小并且所有数据都被默认的构造方法。
var threeDoubles = [Double](repeating: 2.5, count: 3)
var anotherThreeDoubles = Array(repeating: 3.3, count: 3) 
//类型可以被推导出来。[Double]可以换成Array
//使用+组合两种已经存在的相同类型的数组
var sixDoubles = threeDoubles + anotherThreeDoubles

//字典  存储相同类型值的容器。每个值value都关联唯一的键key.key作为字典中这个值数据的标识符。
//定义 Dictionary<K,V> 其中K是字典中的数据类型，V是字典中K对应的值的数据类型。K的唯一限制是可哈希的。这样可以保证它独一无二。所有的swift基本类型：Int，String, Double,Bool默认都是可哈希的。
//字典字面量
//[key 1: value 1]
//下面例子创建了一个存储国际机场名称的字典，key是三个字母的国际航空运输代码，value是机场名称
var airPorts: Dictionary<String,String> = ["TYO": "Tokyo", "DUB": "Dublin"] //注意Dictionary<String,String>中间是,不是：
//和数组一样，如果我们使用字面量来构造字典就不用把类型定义清楚。因为这个语句中所有的键和值分别是相同的数据类型，Swift可以推断出Dictionary<String, String>
var sirports = ["TYO": "Tokyo", "DUB": "Dublin"]
//读取和修改字典
airPorts.count
airPorts["TYO"]
airPorts["LHR"] = "London" //通过下标增加新的数据项
airPorts["LHR"] = "Lodon2" //通过下标修改数据项
//updateValue(forKey:) //可以设置或者更新特定对应的值，返回的是一个字典值类型的可选值。例如：对于存储String值的字典，这个函数会返回一个String?.如果值存在，则这个可选值等于被替换的值（原值），否则将会是nil
if let oldValue = airPorts.updateValue("Dublin Internation", forKey: "DUB") {
    print("The old value of DUB was \(oldValue)")
}
//我们也可用下标语法来在字典中检索特定键对应的值。如果存在值就返回，否则返回nil
if let airportname = airPorts["DUB"] {
    print("The name of the airport is \(airportname)")
} else {
    print("The name is not in the airports")
}
//还可以用下标来通过给某个键的对应值设置为nil来从字典中移除一个键值对
airPorts["APL"] = "Apple Internation"
airPorts["APL"] = nil
//通过removeValufForKey方法也可以用来在字典中移除键值对。

//字典遍历 for-in ，每个字典的数据项以(key, value)元祖返回
for (code, name) in airPorts {
    print("code = \(code), name = \(name)")
}

let arr = airPorts.enumerated()
for (offset, element) in arr {
    print("offset->\(offset), element.key->\(element.key), elment.value->\(element.value)")
}

//也可以通过访问它的keys和values属性，检索一个字典的键或者值
for airportCode in airPorts.keys {
    
}


for airportValue in airPorts.values {
    
}
//可以直接使用keys或values构造一个新数组
let codes = Array(airPorts.keys)
//注意Swift的字典类型是无序集合类型。其中键值对在遍历时会重新排列，其中的顺序是不固定的。
//创建一个空字典
var namesOfIntegers = Dictionary<Int, String>()
namesOfIntegers[16] = "sixteen"
namesOfIntegers = [:]




